var fs = require('fs');
var util = require('util');

/**
 * path 文件地址
 * flags:
 *   r     读，文件不存在抛出异常
 *   r+    读写，文件不存在抛出异常
 **  rs+   同步方式读取和写入文件
 *   w     写，文件不存在则创建
 *   wx    写，文件已存在抛出异常
 *   w+    读写，文件不存在则创建
 *   wx+   读写，文件已存在则读写则失败
 **  a     追加模式，不存在则创建
 *   ax    追加模式，已存在则抛出异常
 *   a+    读取追加模式打开文件，不存在则创建
 *   ax+   文件路径存在则读取追加失败
 *  mode:权限，如：0666(可读可写)
 *  callback：回调函数,fd:文件描述符
 *        标准输入（standard input）的文件描述符是 0，
 *        标准输出（standard output）是 1，
 *        标准错误（standard error）是 2。
 */
fs.open('../input.txt', 'r+', 0666, function(err, fd) {
  if (err) {
    return console.error(err);
  }
  console.log("文件打开成功！");
  console.info('fd:' + fd);
  console.log("--------我是分割线-------------");
});

/**
 * stats.isFile        文件？
 * stats.isDirectory   目录？
 * stats.isBlockDevice 块设备？
 * stats.isCharacterDevice 字符设备？
 * stats.isSymbolicLink 软链接？
 * stats.isFIFO FIFO命令管道？
 * stats.isSocket Socket？
 */
fs.stat('../input.txt', function(err, stats) {
  if (err) {
    return console.error(err);
  }
  console.log('stats:\n' + util.inspect(stats));
  console.log("读取文件信息成功！");
  console.info('isFile ' + stats.isFile());
  console.info('isDirectory ' + stats.isDirectory());
  console.info('isBlockDevice ' + stats.isBlockDevice());
  console.info('isCharacterDevice ' + stats.isCharacterDevice());
  console.info('isSymbolicLink ' + stats.isSymbolicLink());
  console.info('isFIFO ' + stats.isFIFO());
  console.info('isScoket ' + stats.isSocket());
  console.log("--------我是分割线-------------");
});

/**
 * path 路径
 * data 写入的内容
 * options {encoding,mode,flag},默认为：{encoding:'utf8',mode:0666,flag:'w'}
 */
fs.writeFile('./writeFile.txt', '这是要写入的内容', { encoding: 'utf8' }, function(err) {
  if (err) {
    return console.error(err);
  }
  console.log("数据写入成功！");
  console.log("--------我是分割线-------------");
  console.log("读取写入的数据！");
  fs.readFile('./writeFile.txt', function(err, data) {
    if (err) {
      return console.error(err);
    }
    console.log("异步读取文件数据: " + data.toString());
    console.log("准备删除文件！");
    fs.unlink('./writeFile.txt', function(err) {
      if (err) {
        return console.error(err);
      }
      console.log("文件删除成功！");
    });
  });
});

var buf = new Buffer(1024);
fs.open('../input.txt', 'r+', function(err, fd) {
  if (err) {
    return console.error(err);
  }
  console.log("文件打开成功！");
  console.log("准备读取文件：");
  /**
   * fs.read(fd, buffer, offset, length, position, callback)
   * fd 文化描述符
   * buffer 数据写入的缓冲区
   * offset 缓存区写入的偏移
   * length 文件中读取的字节数
   * position 文件读取的位置
   * callback 回调函数，有三个参数err, bytesRead, buffer
   *                     err 为错误信息，
   *                     bytesRead 表示读取的字节数，
   *                     buffer 为缓冲区对象。
   */
  fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) {
    if (err) {
      console.log(err);
    }
    console.log(bytes + "  字节被读取");
    // 仅输出读取的字节
    if (bytes > 0) {
      console.log(buf.slice(0, bytes).toString());
    }
  });

  // 关闭文件
  fs.close(fd, function(err) {
    if (err) {
      console.log(err);
    }
    console.log("文件关闭成功");
  });
  console.log("--------我是分割线-------------");
});


